
let nums = [2, 6, 7, 3, 1, 7]
let m = 3
let k = 4
var maxSum = function (nums, m, k) {
    const cnt = new Map(); //创建哈希表，利用哈希表的key唯一性
    let ans = 0, s = 0;//ans记录最大值，s记录窗口内元素的和
    for (let i = 0; i < nums.length; i++) {
        // 1. 进入窗口
        //i就是右边界

        s += nums[i];//累加
        cnt.set(nums[i], (cnt.get(nums[i]) ?? 0) + 1);//判断是否存在，不存在则设为0再加一，存在则+1

        let left = i - k + 1;//定义左边界
        console.log(s)
        if (left < 0)//如果左边界小于0，说明窗口还没有形成，继续循环,并且不往下执行代码
        {
            continue
        }

        console.log(s)
        // 2. 更新答案
        if (cnt.size >= m) //达到题目要求以后开始更改和的最大值
        {
            ans = Math.max(ans, s);
        }
        //当left>0时窗口已经形成了，需要离开窗口
        // 3. 离开窗口
        const out = nums[left];//定义出窗口的元素

        s -= out;//出窗口的元素从和中减去

        const c = cnt.get(out);//从哈希表中获取出窗口的元素的个数

        if (c > 1) {//大于一说明出窗口的元素在窗口中存在多个，需要减一
            cnt.set(out, c - 1);
        } else {//如果只有一个那就直接把这个key删除，如果c=0其实哈希表里也就没有这个key

            cnt.delete(out);
        }
    }

    return ans;
};
console.log(maxSum(nums, m, k))